using System;
using System.Data;
using Dapper;

namespace hao_Common.Dapper.TypeHandlers
{
    public class GuidTypeHandler : SqlMapper.TypeHandler<Guid>
    {
        public override void SetValue(IDbDataParameter parameter, Guid guid)
        {
            parameter.Value = guid.ToString();
        }

        public override Guid Parse(object value)
        {
            if (value == null || value == DBNull.Value)
                return Guid.Empty;
            
            if (value is string stringValue)
            {
                // 如果是有效的GUID格式，解析它
                if (Guid.TryParse(stringValue, out var guid))
                    return guid;
                
                // 如果不是GUID格式，抛出异常提示数据格式问题
                throw new FormatException($"无法将值 '{stringValue}' 转换为 Guid 类型。请确保数据库中的 Id 字段为有效的 GUID 格式。");
            }
            
            if (value is Guid guidValue)
                return guidValue;
                
            throw new FormatException($"无法将类型 '{value.GetType()}' 转换为 Guid 类型。");
        }
    }

    public class NullableGuidTypeHandler : SqlMapper.TypeHandler<Guid?>
    {
        public override void SetValue(IDbDataParameter parameter, Guid? guid)
        {
            parameter.Value = guid?.ToString() ?? (object)DBNull.Value;
        }

        public override Guid? Parse(object value)
        {
            if (value == null || value == DBNull.Value)
                return null;
            
            if (value is string stringValue)
            {
                if (string.IsNullOrEmpty(stringValue))
                    return null;
                    
                if (Guid.TryParse(stringValue, out var guid))
                    return guid;
                    
                throw new FormatException($"无法将值 '{stringValue}' 转换为 Guid? 类型。请确保数据库中的 Id 字段为有效的 GUID 格式。");
            }
            
            if (value is Guid guidValue)
                return guidValue;
                
            return null;
        }
    }
}